from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
from django.utils.functional import Promise

from tools.myjwt import mjwt
import time, json
from django_redis import get_redis_connection



class PermitionMiddleware(MiddlewareMixin):
    def process_request(self, request):
        # 定义白名单
        wlist = ['/rbac/login/',]
        # 获取token，url指的是接口地址
        url = request.path
        if url not in wlist:
            # 解析验证
            try:
                token = request.headers.get('Authorization')
                data = mjwt.jwt_decode(token)
                # 是否过期
                if int(time.time()) > int(data['exp']):
                    return JsonResponse({"code": 401})
                # 是否过期
                redis_default = get_redis_connection("default")
                ddate = redis_default.get(token)
                if ddate:
                    return JsonResponse({"code": 405, "msg":"请重新登录"})
                # 是否有权限操作
                role_id = data['role_id']
                Promition = redis_default.get("res"+str(role_id))
                if Promition is None:
                    promitions = ["/rbac/loginout/"]
                else:
                    promitions = json.loads(Promition)

                if url not in promitions:
                    return JsonResponse({"code": 402, 'msg':'无此权限'})
                # 查询用户表，获取roleid
                # 查询redis根据roleid
                # 如果存在判断url是否在权限列表中 json.loads()
                # 如果不存在，根据角色获取资源列表，存入redis

                # 从redis中获取token,如果存在，说明已经退出，返回401没有权限操作
                # redis_default = get_redis_connection("default")
                # plist = redis_default.get(data)
                # if plist:
                #     plist = json.loads(plist)
                #     if url not in plist:
                #         return JsonResponse({"code":402})
                # else:
                #      return JsonResponse({"code":403})
            except:
                return JsonResponse({"code": 401})
            # 是否过期
            # 是否退出
            # 是否有接口权限